package com.tom.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.function.Consumer;


/**
 * 用于转换成指定对象基础类
 *
 * @author zx
 * @date 2024年11月06日 8:47
 */
public interface BaseEntity {

    /**
     * 指定目标类型和consumer
     *
     * @param clazz    目标对象的class类型
     * @param consumer 返回目标对象之前可以使用Lambda进行额外字段处理
     * @param <T>      指定目标对象类型
     * @return 目标对象
     */
    default <T> T conTertobject(Class<T> clazz, Consumer<T> consumer) {
        T T = this.conTertObject(clazz);
        consumer.accept(T);
        return T;
    }


    /**
     * 创建目标对象并从原始对象中复制属性
     *
     * @param clazz 目标对象的Class
     * @param <T>   指定目标对象的类型
     * @return 返回指定的目标对象
     */
    default <T> T conTertObject(Class<T> clazz) {
        try {
            Field[] declaredFields = clazz.getDeclaredFields();
            Constructor<T> constructor = clazz.getConstructor();
            T T = constructor.newInstance();

            Arrays.asList(declaredFields).forEach(field -> conTert(field, T));
            return T;

        } catch (Exception e) {
            Logger logger = LoggerFactory.getLogger(BaseEntity.class);
            logger.error("convert error:{}", e.getMessage());
            throw new RuntimeException(e.getMessage());
        }
    }


    /**
     * 复制有茶几的字段、多出的字段等
     *
     * @param field  目标对象字段
     * @param target 目标对象
     */
    default void conTert(Field field, Object target) {
        try {
            Field source = this.getClass().getDeclaredField(field.getName());
            field.setAccessible(true);
            source.setAccessible(true);
            field.set(target, source.get(this));
        } catch (IllegalAccessException | NoSuchFieldException e) {

        }
    }
}
